/*
 * Copyright (c) Sybase, Inc. 2007   
 * All rights reserved.    
 */
package edu.cmu.cs.webapp.ioms.logging;

import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import edu.cmu.cs.webapp.ioms.IOMSActivator;

/**
 * This class will provide UI alert dialogs to the user. These will
 * automatically get the message from the plugin's resource bundle.
 * 
 * NOTE: there are some generic exception methods included in this file. They
 * need resource bundles also, and they make the alerts better when the
 * exception is caught at a later stage.
 * 
 * @author collinsc
 */
public class Alerts {
	private static Alerts _instance = null;

	/**
	 * This string is prepended to all alert keys for storing the don't show
	 * value in preferences.
	 */
	public static String ALERT_DONT_SHOW_KEY = "Alert.dont.show";

	// this is used for junit testing to turn off all alerts and return the
	// default on yes/no dialogs.
	public static boolean _noAlerts = false;

	private String _pluginId;
	protected IPreferenceStore _preferenceStore;

	/**
	 * Construct a alerts with the provided attributes. This constructor should
	 * be used from the root plugin that has access to the resource bundle for
	 * this plugin.
	 * 
	 * @param AbstractUIPlugin
	 *            the name plugin.
	 * @param rb
	 *            the resource bundle to use.
	 */
	private Alerts(AbstractUIPlugin plugin) {

		if (plugin == null) {
			throw new NullPointerException(
					"No plugin was provided to the Alerts."); //$NON-NLS-1$
		}
		_pluginId = plugin.getBundle().getSymbolicName();
		_preferenceStore = plugin.getPreferenceStore();
	}

	public static Alerts getInstance() {
		if (_instance == null) {
			_instance = new Alerts(IOMSActivator.getDefault());
		}

		return _instance;
	}

	/**
	 * Returns the text entered by a user in a simple request dialog.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param initialValue
	 *            - initial value in the text area.
	 * @param validator
	 *            - something that checks for validity on the name.
	 * @return null is returned if the user hits cancel, otherwise it is the
	 *         text they entered.
	 */
	public String getInput(String titleKey, String msgKey, String initialValue,
			IInputValidator validator) {
		if (_noAlerts)
			return null;

		InputDialog inDialog = new InputDialog(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), getResourceString(msgKey),
				initialValue, validator);
		inDialog.open();
		return inDialog.getValue();
	}

	/**
	 * Displays an Error message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 */
	public void error(String titleKey, String msgKey) {
		if (_noAlerts)
			return;

		MessageDialog.openError(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), getResourceString(msgKey));
	}

	/**
	 * Displays an Error message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 */
	public void error(String titleKey, String msgKey, Object arg0) {
		if (_noAlerts)
			return;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openError(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an Error message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 */
	public void error(String titleKey, String msgKey, Object arg0, Object arg1) {
		if (_noAlerts)
			return;

		Object[] args = new Object[2];
		args[0] = arg0;
		args[1] = arg1;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openError(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an Error message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 * @param arg2
	 *            - arg to place into the resource bundle message.
	 */
	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
			Object arg2) {
		if (_noAlerts)
			return;

		Object[] args = new Object[3];
		args[0] = arg0;
		args[1] = arg1;
		args[2] = arg2;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openError(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an Error message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 * @param arg2
	 *            - arg to place into the resource bundle message.
	 * @param arg3
	 *            - arg to place into the resource bundle message.
	 */
	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
			Object arg2, Object arg3) {
		if (_noAlerts)
			return;

		Object[] args = new Object[4];
		args[0] = arg0;
		args[1] = arg1;
		args[2] = arg2;
		args[3] = arg3;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openError(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an Error message to the user.
	 * 
	 * @param shell
	 *            - the shell for the error dialog
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 */
	public void error(Shell shell, String titleKey, String msgKey) {
		if (_noAlerts)
			return;

		MessageDialog.openError(shell, getResourceString(titleKey),
				getResourceString(msgKey));
	}

	/**
	 * Displays an Error message to the user with a status using the Display
	 * background thread.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 */
	public void detailError(String titleKey, String msgKey) {
		if (_noAlerts)
			return;

		final IStatus fstatus = new Status(IStatus.ERROR, _pluginId,
				IStatus.OK, getResourceString(msgKey), null);
		final String ftitle = getResourceString(titleKey);

		Display display = getStandardDisplay();
		display.asyncExec(new Runnable() {
			public void run() {
				ErrorDialog.openError(PlatformUI.getWorkbench()
						.getActiveWorkbenchWindow().getShell(), ftitle, null,
						fstatus);
			}
		});
	}

	/**
	 * Displays an Error message to the user with a status using the Display
	 * background thread. This will give the details button.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param tt
	 *            - exception to place in the details.
	 */
	public void detailError(String titleKey, String msgKey, Throwable tt) {
		if (_noAlerts)
			return;

		internalDetailError(getResourceString(titleKey),
				getResourceString(msgKey), tt);
	}

	/**
	 * Displays an Error message to the user with a status using the Display
	 * background thread. This will give the details button.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param tt
	 *            - exception to place in the details.
	 */
	public void detailError(String titleKey, String msgKey, Object arg0,
			Throwable tt) {
		if (_noAlerts)
			return;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		internalDetailError(getResourceString(titleKey),
				formatter.format(args), tt);
	}

	/**
	 * Displays an Error message to the user with a status using the Display
	 * background thread. This will give the details button.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 * @param tt
	 *            - exception to place in the details.
	 */
	public void detailError(String titleKey, String msgKey, Object arg0,
			Object arg1, Throwable tt) {
		if (_noAlerts)
			return;

		Object[] args = new Object[2];
		args[0] = arg0;
		args[1] = arg1;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		internalDetailError(getResourceString(titleKey),
				formatter.format(args), tt);
	}

	/**
	 * Displays an Error message to the user with a status using the Display
	 * background thread. This will give the details button.
	 * 
	 * @param title
	 *            - the title message
	 * @param message
	 *            - message displayed to the user
	 */
	private void internalDetailError(String title, String msg, Throwable tt) {
		if (_noAlerts)
			return;

		Throwable error = tt;
		if (error instanceof InvocationTargetException) {
			Throwable tt2 = ((InvocationTargetException) error)
					.getTargetException();
			if (tt2 != null)
				error = tt2;
		}

		IStatus status = null;
		if (error instanceof CoreException) {
			status = ((CoreException) error).getStatus();

			if ((status instanceof MultiStatus) == false) {
				// convert to a multi-status to show the exception details.

				Throwable th = status.getException();
				if (th == null)
					th = error;

				status = buildStackTraceStatus(IStatus.ERROR, status
						.getPlugin(), status.getMessage(), th);
			}
		} else {
			status = buildStackTraceStatus(IStatus.ERROR, _pluginId,
					getExceptionMessage(error), error);
		}

		final String ftitle = title;
		final IStatus fstatus = status;
		final String fmsg = msg;
		Display display = getStandardDisplay();
		display.asyncExec(new Runnable() {
			public void run() {
				ErrorDialog.openError(PlatformUI.getWorkbench()
						.getActiveWorkbenchWindow().getShell(), ftitle, fmsg,
						fstatus);
			}
		});
	}

	/**
	 * Builds a multi-status, so that the stack trace shows up in the alert
	 * message for detailed alerts.
	 * 
	 * @param code
	 * @param pluginId
	 * @param message
	 * @param tt
	 * @return
	 */
	public IStatus buildStackTraceStatus(int code, String pluginId,
			String message, Throwable tt) {
		if (tt == null) {
			return new Status(code, pluginId, IStatus.OK, message, tt);
		}

		MultiStatus mstat = new MultiStatus(pluginId, code, message, tt);

		StackTraceElement[] trace = tt.getStackTrace();

		mstat.add(new Status(code, pluginId, IStatus.OK, tt.toString(), null));
		for (int ii = 0; ii < trace.length; ii++) {
			mstat.add(new Status(code, pluginId, IStatus.OK, trace[ii]
					.toString(), null));
		}
		return mstat;
	}

	/**
	 * Displays an Error message to the user with a status using the Display
	 * background thread. This will give the details button.
	 * 
	 * @param status
	 *            - the status
	 * @param title
	 *            - the title of the message
	 */
	public void detailError(String title, IStatus status) {
		if (_noAlerts)
			return;

		final IStatus fstatus = status;
		final String ftitle = title;
		Display display = getStandardDisplay();
		display.asyncExec(new Runnable() {
			public void run() {
				ErrorDialog.openError(PlatformUI.getWorkbench()
						.getActiveWorkbenchWindow().getShell(), ftitle, null,
						fstatus);
			}
		});
	}

	/**
	 * Displays an information message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 */
	public void info(String titleKey, String msgKey) {
		if (_noAlerts)
			return;

		MessageDialog.openInformation(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), getResourceString(msgKey));
	}

	/**
	 * Displays an information message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 */
	public void info(String titleKey, String msgKey, Object arg0) {
		if (_noAlerts)
			return;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openInformation(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an information message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 */
	public void info(String titleKey, String msgKey, Object arg0, Object arg1) {
		if (_noAlerts)
			return;

		Object[] args = new Object[2];
		args[0] = arg0;
		args[1] = arg1;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openInformation(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an information message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 * @param arg2
	 *            - arg to place into the resource bundle message.
	 */
	public void info(String titleKey, String msgKey, Object arg0, Object arg1,
			Object arg2) {
		if (_noAlerts)
			return;

		Object[] args = new Object[3];
		args[0] = arg0;
		args[1] = arg1;
		args[2] = arg2;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openInformation(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an Info message to the user with a status using the Display
	 * background thread. This will give the details button.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param message
	 *            - message to display at the top of the details section.
	 * @param messages
	 *            - list of messages to place as status items in the detail
	 *            message.
	 */
	public void detailInfo(String titleKey, String msgKey, String message,
			String[] messages) {
		detailInfo(titleKey, msgKey, null, message, messages);
	}

	/**
	 * Displays an Info message to the user with a status using the Display
	 * background thread. This will give the details button.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - argument to place into the resource bundle message.
	 * @param message
	 *            - message to display at the top of the details section.
	 * @param messages
	 *            - list of messages to place as status items in the detail
	 *            message.
	 */
	public void detailInfo(String titleKey, String msgKey, Object arg0,
			String message, String[] messages) {
		if (_noAlerts)
			return;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		final String ftitle = getResourceString(titleKey);
		final IStatus fstatus = buildMessageStatus(IStatus.INFO, _pluginId,
				message, messages);
		final String fmsg = formatter.format(args);
		Display display = getStandardDisplay();
		display.asyncExec(new Runnable() {
			public void run() {
				ErrorDialog.openError(PlatformUI.getWorkbench()
						.getActiveWorkbenchWindow().getShell(), ftitle, fmsg,
						fstatus);
			}
		});
	}

	/**
	 * Builds a status from strings, so that it can be used in an info status.
	 * 
	 * @param code
	 * @param pluginId
	 * @param message
	 *            the main message for the message array.
	 * @param messages
	 *            the message array to give a history on.
	 * @return
	 */
	public IStatus buildMessageStatus(int code, String pluginId,
			String message, String[] messages) {
		if ((messages == null) || (messages.length == 0)) {
			return new Status(code, pluginId, IStatus.OK, message, null);
		}

		MultiStatus mstat = new MultiStatus(pluginId, code, message, null);

		mstat.add(new Status(code, pluginId, IStatus.OK, message, null));
		for (int ii = 0; ii < messages.length; ii++) {
			if (messages[ii] != null) {
				mstat.add(new Status(code, pluginId, IStatus.OK, messages[ii],
						null));
			}
		}
		return mstat;
	}

	/**
	 * Displays an confirmation message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @return true if the user presses the OK button, false otherwise
	 */
	public boolean confirm(String titleKey, String msgKey) {
		if (_noAlerts)
			return true;

		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), getResourceString(msgKey));
	}

	/**
	 * Displays an confirmation message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @return true if the user presses the OK button, false otherwise
	 */
	public boolean confirm(String titleKey, String msgKey, Object arg0) {
		if (_noAlerts)
			return true;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an question message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @return true if the user presses the "yes" button, false otherwise
	 */
	public boolean question(String titleKey, String msgKey) {
		if (_noAlerts)
			return true;

		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), getResourceString(msgKey));
	}

	/**
	 * Displays an question message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @return true if the user presses the "yes" button, false otherwise
	 */
	public boolean question(String titleKey, String msgKey, Object arg0) {
		if (_noAlerts)
			return true;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Displays an warning message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 */
	public void warning(String titleKey, String msgKey) {
		if (_noAlerts)
			return;

		MessageDialog.openWarning(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), getResourceString(msgKey));
	}

	/**
	 * Displays an warning message to the user.
	 * 
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 */
	public void warning(String titleKey, String msgKey, Object arg0) {
		if (_noAlerts)
			return;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		MessageDialog.openWarning(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), formatter.format(args));
	}

	/**
	 * Returns the standard display to be used. The method first checks, if the
	 * thread calling this method has an associated dispaly. If so, this display
	 * is returned. Otherwise the method returns the default display.
	 */
	public Display getStandardDisplay() {
		Display display = Display.getCurrent();
		if (display == null) {
			display = Display.getDefault();
		}
		return display;
	}

	/**
	 * Returns the string from the resource bundle, or 'key' if not found.
	 */
	public String getResourceString(String value) {
		return value;
	}

	/**
	 * Throw a core exception built around the message with the correct plugin
	 * id and resource bundle string.
	 * 
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @throws CoreException
	 */
	public void throwCoreException(String msgKey) throws CoreException {
		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
				getResourceString(msgKey), null);
		throw new CoreException(status);
	}

	/**
	 * Throw a core exception built around the message with the correct plugin
	 * id and resource bundle string.
	 * 
	 * @param ee
	 *            - the real exception.
	 * @throws CoreException
	 */
	public void throwCoreException(Throwable ee) throws CoreException {
		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
				getExceptionMessage(ee), ee);
		throw new CoreException(status);
	}

	/**
	 * Throw a core exception built around the message with the correct plugin
	 * id and resource bundle string.
	 * 
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param ee
	 *            - the real exception.
	 * @throws CoreException
	 */
	public void throwCoreException(String msgKey, Throwable ee)
			throws CoreException {
		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
				getResourceString(msgKey), ee);
		throw new CoreException(status);
	}

	/**
	 * Throw a core exception built around the message with the correct plugin
	 * id and resource bundle string.
	 * 
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @throws CoreException
	 */
	public void throwCoreException(String msgKey, Object arg0)
			throws CoreException {
		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
				formatter.format(args), null);
		throw new CoreException(status);
	}

	/**
	 * Throw a core exception built around the message with the correct plugin
	 * id and resource bundle string.
	 * 
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param ee
	 *            - the real exception.
	 * @throws CoreException
	 */
	public void throwCoreException(String msgKey, Object arg0, Throwable ee)
			throws CoreException {
		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
				formatter.format(args), ee);
		throw new CoreException(status);
	}

	/**
	 * Throw a core exception built around the message with the correct plugin
	 * id and resource bundle string.
	 * 
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 * @throws CoreException
	 */
	public void throwCoreException(String msgKey, Object arg0, Object arg1)
			throws CoreException {
		Object[] args = new Object[2];
		args[0] = arg0;
		args[1] = arg1;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
				formatter.format(args), null);
		throw new CoreException(status);
	}

	/**
	 * Throw a core exception built around the message with the correct plugin
	 * id and resource bundle string.
	 * 
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 * @param arg1
	 *            - arg to place into the resource bundle message.
	 * @param ee
	 *            - the real exception.
	 * @throws CoreException
	 */
	public void throwCoreException(String msgKey, Object arg0, Object arg1,
			Throwable ee) throws CoreException {
		Object[] args = new Object[2];
		args[0] = arg0;
		args[1] = arg1;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
				formatter.format(args), ee);
		throw new CoreException(status);
	}

	/**
	 * Always get a message from the exception.
	 * 
	 * @param ee
	 * @return
	 */
	private String getExceptionMessage(Throwable ee) {
		// Change for CR547892-1. Sometimes, the error message is too long to
		// see the detail button on the message dialog.
		// So substring the error message to a comfortable size.
		StringBuffer message = new StringBuffer();
		if (ee.getMessage() == null) {
			message.append(ee.toString());
		} else {
			message.append(ee.getMessage());
		}
		int maxLength = 256;
		if (message.length() >= maxLength) {
			message = new StringBuffer(message.substring(0, maxLength));
			message.append("......");
		}
		return message.toString();
	}

	/**
	 * Displays an Error message to the user. Adds a checkbox with preference
	 * saving to not show this dialog again.
	 * 
	 * @param prefKey
	 *            - optional, to use a specific key (it will still be prepended
	 *            with ALERT_DONT_SHOW_KEY) If nothing is passed, the msgKey is
	 *            used.
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 */
	public void errorDontShowAgainDialog(String prefKey, String titleKey,
			String msgKey, Object arg0) {
		String key = prefKey;
		if ((key == null) || (prefKey.length() == 0)) {
			key = msgKey;
		}
		if (_noAlerts)
			return;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		DontShowAgainDialog.openError(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), this._preferenceStore,
				ALERT_DONT_SHOW_KEY + key, formatter.format(args));

	}

	/**
	 * Displays an Info message to the user. Adds a checkbox with preference
	 * saving to not show this dialog again.
	 * 
	 * @param prefKey
	 *            - optional, to use a specific key (it will still be prepended
	 *            with ALERT_DONT_SHOW_KEY) If nothing is passed, the msgKey is
	 *            used.
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 */
	public void infoDontShowAgainDialog(String prefKey, String titleKey,
			String msgKey, Object arg0) {
		String key = prefKey;
		if ((key == null) || (prefKey.length() == 0)) {
			key = msgKey;
		}
		if (_noAlerts)
			return;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		DontShowAgainDialog.openInformation(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), this._preferenceStore,
				ALERT_DONT_SHOW_KEY + key, formatter.format(args));
	}

	/**
	 * Displays an Error message to the user. Adds a checkbox with preference
	 * saving to not show this dialog again.
	 * 
	 * @param prefKey
	 *            - optional, to use a specific key (it will still be prepended
	 *            with ALERT_DONT_SHOW_KEY) If nothing is passed, the msgKey is
	 *            used.
	 * @param titleKey
	 *            - the title resource bundle key for the message
	 * @param msgKey
	 *            - message resource bundle key for the message displayed to the
	 *            user
	 * @param arg0
	 *            - arg to place into the resource bundle message.
	 */
	public boolean questionDontShowAgainDialog(String prefKey, String titleKey,
			String msgKey, Object arg0) {
		String key = prefKey;
		if ((key == null) || (prefKey.length() == 0)) {
			key = msgKey;
		}
		if (_noAlerts)
			return true;

		Object[] args = new Object[1];
		args[0] = arg0;

		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));

		return DontShowAgainDialog.openQuestion(PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getShell(),
				getResourceString(titleKey), this._preferenceStore,
				ALERT_DONT_SHOW_KEY + key, formatter.format(args));
	}
}
